#ifndef VARDICT_H
#define VARDICT_H

#include "var.h"
#include "scriptServer.h"

namespace sge {

class VarDict {
private:
    StringVarMap vars;
    
protected:
    Var& getVar(const String& varName) const;
    
    static ScriptServer* scriptServer;
    
public:
    VarDict();
    VarDict(PythonObject dict);

    bool getB(const String& varName) const;
    int getI(const String& varName) const;
    float getF(const String& varName) const;
    String getS(const String& varName) const;
    Vector3 getV(const String& varName) const;
    Quaternion getQ(const String& varName) const;
    
    void setB(const String& varName, bool b);
    void setI(const String& varName, int i);
    void setF(const String& varName, float f);
    void setS(const String& varName, String s);
    void setV(const String& varName, Vector3 v);
    void setQ(const String& varName, Quaternion q);
    
    void defaultB(const String& varName, bool b);
    void defaultI(const String& varName, int i);
    void defaultF(const String& varName, float f);
    void defaultS(const String& varName, String s);
    void defaultV(const String& varName, Vector3 v);
    void defaultQ(const String& varName, Quaternion q);
    
    bool hasVar(const String& varName) const;
    
    bool getVarDirty(const String& varName) const;
    void setVarDirty(const String& varName, bool _dirty);
    
    virtual void onSetVar(const String& varName) {}
    virtual void onGetVar(const String& varName) const {}
    
    StringList getVarNames();
    PythonObject pyGetVarNames();
    
    void pySetVar(const String& varName, PythonObject val);
    void pyDefaultVar(const String& varName, PythonObject val);
    PythonObject pyGetVar(const String& varName) const;
    
    void fromPythonDict(PythonObject dict);
    PythonObject toPythonDict() const;
    
    static void registerPythonBindings();
};

}

#endif
